home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
m68k
/
tutor.arc
/
MMDI.SA
< prev
next >
Wrap
Text File
|
1990-01-05
|
10KB
|
330 lines
MMDI IDNT 1,1 Modify Memory command WITH asm/disasm 11/27/81
XDEF MCMD
XDEF MMCMD
XDEF MM90
SPC 1
XREF CKADDR
XREF CKWADR
XREF FIXBUF
XREF FIXDCRLF
XREF FNEXTF
XREF FRELADDR
XREF GETA
XREF GETEXP
XREF MACSBUG
XREF MSG
XREF MSGEOT
XREF MSG017
XREF OUTPUT
XREF OUT1CR
XREF PNT2HX
XREF PNT4HX
XREF PNT8HX
XREF PORTIN1
XREF PORTIN1N
XREF SYNTAX
XREF.S SYSTACK
XREF DCODE68K DISASSEMBLER
XREF CODE68K ASSEMBLER
PAGE
SECTION 11
* MODIFY MEMORY
* COMMON REGISTER USAGE
* A6 IO BUFFER POINTER END
* A5 IO BUFFER POINTER START
* A4 ADDRESS TO MODIFY
* A3
* A2
* A1
* A0
* D7 DATA READ (DATA STORED)
* D6 SIZE 1/2/4 BYTES (ASM/DISASM 2 - 10 BYTES)
* D5 OVERRIDE BYTE (80XX=NON VERIFY) (XX80=BYTE SIZE)
*
* ;OPTIONS
* ;W WORD
* ;L LONG WORD (4 BYTES)
* ;DI DISASSEMBLE
* ;O ODD ADDRESSES ONLY
* ;V EVEN ADDRESSES ONLY
* ;N NON-VERIFY
*
MMDI BSR CKWADR
BSR CKADDR
CLR.L D6 SIZE = 0
MMDI22 ADD.L D6,A4 PC = PC + SIZE
MMDI23 BSR FIXBUF A5 & A6 = POINTER TO BUFFER
* ENTRY
* A4 = PROGRAM COUNTER
* A5 = POINTER TO STORE DISASSEMBLED LINE
MOVEM.L (A4),D0-D2 DATA TO DISASSEMBLE
BSR DCODE68K
* RETURN
* A4 = NEW PROGRAM COUNTER
* A5 = PTR START BUFFER
* A6 = PRT END BUFFER
* D6 = NUMBER OF BYTES DISASSEMBLED
MOVE.B #'?',(A6)+
BSR OUTPUT
MMDI31 BSR FIXBUF
BSR PORTIN1N INPUT ASSEMBLY SOURCE (NO LINE FEED)
CMP.L A5,A6
BNE.S MMDI34
BSR OUT1CR NOTHING INPUT; OUTPUT LINE FEED
BRA MMDI23
MMDI34 SUB.L D6,A4 BACKUP PC
CMP.B #'.',(A5)
BEQ MM905 CLOSE
LEA SYSTACK+17,A3 STORE BUFFER
* A3 = STORE POINTER
* A4 = PROGRAM COUNTER
* A5 = POINTER TO DATA TO ASSEMBLE
* A6 = POINTER TO END OF SOURCE DATA
BSR CODE68K ASSEMBLE
* A3 = POINTER TO LINE ASSEMBLED
* A4 = PROGRAM COUNTER
* A6 = POINTER END OF LINE ASSEMBLED
* D0-D2 = DATA ASSEMBLED
* D6 = NUMBER OF BYTES ASSEMBLED
* D7 = ERROR FLAG & POSITION OF ERROR
MOVE.L A3,A5
ADD.L #78,A3 A3 = MAX LINE
MMDI26 CMP.L A6,A3
BCS.S MMDI27
MOVE.B #' ',(A6)+ SPACE FILL LINE
BRA MMDI26
MMDI27 BSR OUT1CR PRINT LINE JUST ENTERED
TST.B D7
BNE.S MMDI30 ERROR; DON'T STORE DATA
LEA SYSTACK+4,A2 A2 = TEMP AREA
MOVEM.L D0/D1/D2,-(A2) STORE DATA
MOVE.L D6,D1 D1 = NUMBER OF BYTES TO STORE
SUB.L #1,D1
MOVE.L A4,A1 A1 = DATA STORE POINTER
MMDI29 MOVE.B (A2)+,D0
MOVE.B D0,(A1)
MOVE.B (A1)+,D2 INSURE DATA STORED
CMP.B D0,D2
BNE MM90
DBRA D1,MMDI29
BRA MMDI22
MMDI30 BSR FIXBUF
MMDI44 MOVE.B #' ',(A6)+ SPACES
DBRA D7,MMDI44
MOVE.B #'X',-1(A6) X UNDER ERROR
MOVE.B #'?',(A6)+ ? ALLOW REINPUT
BSR OUTPUT
BRA MMDI31
PAGE
MCMD DS 0 "M" Alias for "MM" Command
MMCMD DS 0 "MM" Command -Memory Modify-
LEA SYNTAX(PC),A0 A0=ERROR RETURN
BSR FNEXTF
BSR GETA
MOVE.L D0,A4 A4= ADDRESS OF DATA
MOVE.L #1,D6 SIZE = BYTE
CLR.L D5 NO OVERRIDE
SPC 1
MM05 CMP.L A5,A6
BCS.S MM10 AT END OF BUFFER
SPC 1
* LOOK FOR ;OPTIONS
MOVE.B (A5)+,D0
CMP.B #';',D0
BNE MM05 IGNORE NOT ;
SPC 1
MOVE.B (A5)+,D0 GET NEXT CHAR
CMP.B #'D',D0
BNE.S MM045
CMP.B #'I',(A5)+ DISSAMBLY OPTION
BNE MM05
BRA MMDI
MM045 CMP.B #'W',D0
BEQ.S MM065 ;W D6=2
SPC 1
CMP.B #'L',D0
BNE.S MM054
MOVE.B #4,D6 ;L D6=4
CLR.B D5 RESET BYTE OVERRIDE
BRA MM05
SPC 1
MM054 CMP.B #'N',D0
BNE.S MM056
OR.W #$8000,D5 ;N D5=$8000
BRA MM05
SPC 1
MM056 CMP.B #'O',D0
BNE.S MM058
MOVE.L A4,D0 ;O
OR.B #1,D0 FORCE ODD ADDRESS
BRA.S MM060
SPC 1
MM058 CMP.B #'V',D0
BNE SYNTAX ERROR
MOVE.L A4,D0 ;V
AND.B #$FE,D0 FORCE EVEN ADDRESS
MM060 MOVE.L D0,A4
OR.B #$80,D5 BYTE OVERRIDE
MM064 MOVE.B #2,D6 SIZE = WORD (2 BYTES)
BRA MM05
SPC 1
MM065 CLR.B D5 RESET BYTE OVERRIDE
BRA MM064
SPC 1
* FORMAT ADDRESS FOR PRINTING
MM10 MOVE.L A4,D0
CMP.B #1,D6
BEQ.S MM11 "BYTE"
TST.B D5
BMI.S MM11 BYTE OVERRIDE
BSR CKWADR CHK ALLIGNMENT
MM11 BSR CKADDR *
BSR FIXBUF
BSR FRELADDR FORM RELATIVE ADDRESS
MOVE.B #' ',(A6)+ SPACE
SPC 1
TST.W D5
BMI.S MM18 NON-VERIFY (DON'T READ MEMORY)
SPC 1
* READ DATA FROM MEMORY & FORMAT IT
TST.B D5
BMI.S MM12 BYTE OVERRIDE
SPC 1
CMP.B #2,D6
BEQ.S MM14 WORD
CMP.B #4,D6
BEQ.S MM16 LONG WORD
SPC 1
* BYTE
MM12
MOVE.B (A4),D7 D7 = DATA READ
MOVE.L D7,D0
BSR PNT2HX FORMAT BYTE
BRA.S MM18
SPC 1
* WORD
MM14
MOVE.W (A4),D7
MOVE.L D7,D0
BSR PNT4HX FORMAT WORD
BRA.S MM18
SPC 1
* LONG WORD
MM16
MOVE.L (A4),D7
MOVE.L D7,D0
BSR PNT8HX FORMAT LONG WORD
SPC 1
MM18 MOVE.B #' ',(A6)+ SPACE
MOVE.B #'?',(A6)+
BSR OUTPUT
PAGE
* READ USER INPUT
* [DATA] (CR) NEXT
* ^ LAST
* = SAME
* . EXIT
SPC 1
BSR FIXBUF
BSR PORTIN1
CMP.L A5,A6
BEQ MM50 NO DATA (CR ONLY)
SPC 1
LEA MM40(PC),A0 A0 = NO PARAMETER RETURN
BSR FNEXTF FIND NEXT FIELD
SPC 1
* IF = ^ OR . TAKE ACTION
MOVE.B (A5),D0
CMP.B #'=',D0
BEQ MM10
CMP.B #'.',D0
BEQ MACSBUG
CMP.B #'^',D0
BEQ.S MM60
SPC 1
BSR GETEXP GET DATA
MOVE.L D0,D7 D7=DATA STORED
SPC 1
* WE HAVE DATA; STORE IT
TST.B D5
BMI.S MM22 BYTE OVERRIDE
SPC 1
CMP.B #2,D6
BEQ.S MM24 WORD
CMP.B #4,D6
BEQ.S MM26 LONG WORD
SPC 1
* BYTE
MM22
MOVE.B D0,(A4) STORE DATA
TST.W D5
BMI.S MM40 NO-VERIFY
MOVE.B (A4),D0
CMP.B D7,D0
BNE.S MM90 NO MATCH
BRA.S MM40
SPC 1
* WORD
MM24
MOVE.W D0,(A4) STORE
TST.W D5
BMI.S MM40 DO NOT VERIFY
MOVE.W (A4),D0
CMP.W D7,D0
BNE.S MM90 NO MATCH
BRA.S MM40
SPC 1
* LONG WORD
MM26
MOVE.L D0,(A4)
TST.W D5
BMI.S MM40 DO NOT VERIFY
MOVE.L (A4),D0
CMP.L D7,D0
BNE.S MM90 NO MATCH
SPC 1
* LOOK FOR . = ^
MM40 MOVE.B (A5),D0
CMP.B #'.',D0
BEQ MACSBUG DONE
CMP.B #'^',D0
BEQ.S MM60 BACKUP ADDRESS
CMP.B #'=',D0
BEQ MM10 ADDRESS STAYS THE SAME
CMP.B #' ',D0
BEQ.S MM50
CMP.L A5,A6
BNE SYNTAX ERROR
SPC 1
* ADDRESS LOW TO HIGH
MM50 ADD.L D6,A4
BRA MM10
SPC 1
* ADDRESS HIGH TO LOW
MM60 SUB.L D6,A4
BRA MM10
SPC 1
MM90 LEA MSG017(PC),A5 'DATA DID NOT STORE'
MM95 BSR FIXDCRLF
BRA MSG
MM905 LEA MSGEOT(PC),A5
BRA MM95
END